package 数组.middle;

import java.util.Arrays;

/**
 * @author Lw中
 * @date 2020/8/17 10:18
 */
public class Mst0108 {

    /**
     *  先将存在0的行和第一列全变为0，再将其余位置变为0
     * @param matrix
     * @return
     */
    public static int[][] setZeroes(int[][] matrix) {
        int h = matrix.length, w = matrix[0].length;
        boolean delRow = false, del1stRow = false;
        for (int i = 0; i < h; i++) {
            for (int j = 0; j < w; j++) {
                if (matrix[i][j] == 0) {
                    // 标记第一行是否清零
                    if (i == 0) {
                        del1stRow = true;
                    }
                        // 标记除第一行外的其他行是否清零
                    else {
                        delRow = true;
                    }
                    // 用第一行保存所需清零的列的下标
                    matrix[0][j] = 0;
                }
            }
            // 遍历完此行之后判断是否清零
            if (delRow && i != 0) {
                // 一：先进行除了第一行外的行清零
                matrix[i] = new int[w];
                // 清零标记重置
                delRow = false;
            }
        }
        // 根据第一行保存的列下标清零
        for (int i = 1; i < h; i++) {
            for (int j = 0; j < w; j++) {
                if (matrix[0][j] == 0) {
                    // 二：再根据第一行保存的0来进行列清零
                    matrix[i][j] = 0;
                }
            }
        }
        // 最后清零第一行
        if (del1stRow) {
            // 三：根据标记进行第一行清零
            matrix[0] = new int[w];
        }
        return matrix;
    }

    public static void main(String[] args) {
        int[][] arr = {{1,1,1}, {1,0,1}, {1,1,1}};
        int[][] ints = setZeroes(arr);
        for (int i = 0; i < ints.length; i++) {
            System.out.println(Arrays.toString(ints[i]));
        }
    }

}
